# -*- coding: utf8 -*-
"""
Created on Tue Oct 16 16:31:24 2012

@author: (Ago) Milan Augustin

aaaugustin@gmail.com
"""


import serial, time
#from PyQt4.Qt import QTimer

class PohybZ():
    def __init__(self, portN):
        #self.com = serial.Serial(0, baudrate=38400, timeout = 1, xonxoff=True)  # inicializace portu COM1
        #self.com.write("Otevře port\n")
        #self.rx = self.com.readline()     # do promenne rx nacte vse co je ve vstupnim bufferu
        #print self.rx                # vypise nacteny retezec

        
        self.nahoruPom = "!0V50\r !0A5\r !0L600\r"
        self.nahor = "!0V1000\r !0A100\r !0L16000\r"
        self.doluPom = "!0V50\r !0A5\r !0L-600\r"
        self.dol = "!0V1000\r !0A100\r !0L-14000\r"
        self.krokN = "!0V1350\r !0A10\r !0L1900\r"
        self.pocetCV = 0
        
        self.port = False  
        if portN:
            self.port = True
        else:
            self.port = False
            

    
    def referenceZ(self):
        if self.port:
            self.otevreP()
            self.com.write("!0SR2\r")
            self.rx = self.com.readline() 
            print "Referencni pohyb Z", self.rx
            self.com.write("!0WX-25000,2000,1000,500\r")
            time.sleep(12)
            self.com.write("!0P\r")   # aktualni poloha
            self.rx = self.com.readline()
            print "Poloha aktualni =", self.rx
            self.zavreP()
            self.setPolohaZNul()
            print " PRIPRAVENO K TISKU !!!"
        else:
            print " Reference nulová poloha"
            
  #-------------------------------------------------------------- ČIŠŤĚNÍ         
     # Zjistí aktuální polohu osy X       
    def getPolohaZ(self):
        if self.port:
            self.otevreP() 
            self.com.write("!0NY0\r !0P\r")   # aktualni poloha X vynuluje Y
            self.rx = self.com.readline()
            print "Poloha aktualni =", self.rx
            self.zavreP()
        else:
            print " Reference nulová poloha"   
    
    # Nastaví čítač (Gravos) polohy X na (0)        
    def setPolohaZNul(self):
        if self.port:
            self.otevreP()
            self.com.write("!0NX0\r")   # aktualni poloha
            self.ro = self.com.readline()
            print "Poloha aktualni nastavena =", self.ro
            self.zavreP()
        else:
            print " Reference nulová poloha"
            
  #čištění------------------------------------------------------------          
      # Nastaví podium (Z) do horní čisticí polohy cca 4cm nahoru  
    def setCisteni(self):
        zdvih = 2000 # nastavení potřebného Zdvihu
        self.pocetCV = self.pocetCV +23  # počet čisticích vrstev + vrstva
        self.zdvih =str(zdvih)
        self.getPolohaZ()
        rx =self.rx[4:-3] # aktualni poloha Z
        self.rxDalsi = str(rx) #po zkončení čištění nastavit čítač na tuto hodnotu
                     #"!0NX"+self.rx+"\r" – nastaví čítač pozice na hodnotu 
        print  "Poloha tisk podia -"+self.rxDalsi
        rx=int(rx)
        rx =rx + zdvih    # -dosavadní tisk a Zdvih 
        rx = rx - self.pocetCV      # -po každém čistění snížit (23 = 0,055mm)
        rx=str(rx)
        print  "Poloha cisticiho podia -"+rx
        self.posun =rx
        self.otevreP()
        self.com.write("!0V1000\r !0A100\r !0L"+self.zdvih+"\r") #posun nahoru o zdvih
        self.zavreP()
        self.posunVanaP()
      
        #Posune vanu do čisticí polohy
    def posunVanaP(self):
        if self.port: # přepne ovládání M2
            self.otevreP()            
            self.com.setDTR(1)
            print "Rele C SEPNUTO"
            time.sleep(6)
            # posunout vanu - zkontrolovat posunutí vanyTODO
            print "Vana vpravo"
            self.zavreP()
            print "Rele C vypnuto"
            
        else:
            print "Sepne rele C"        

        self.cisteni() # Nastaví podium (Z) do dolní čisticí polohy  
        
        #Posune vanu zpět do tisk polohy
    def posunVanaL(self):
        if self.port: # přepne ovládání M2
            self.otevreP()            
            self.com.setDTR(1)
            print "Rele C SEPNUTO"
            time.sleep(6)
            # posunout vanu - zkontrolovat posunutí vanyTODO
            print "Vana vlevo"
            self.zavreP()
            print "Rele C vypnuto"
            
        else:
            print "Sepne rele C"
            
        self.cisteniNavrat()

            
        #Nastaví podium do dolní čisticí polohy - spustí čištění -vrátí se nahoru
    def cisteni(self):   
        # sjede do dolní polohy (0)
        self.otevreP()
        self.com.write("!0V2000\r !0A100\r !0L-"+self.posun+"\r") # -dosavadní tisk + zdvih    
        time.sleep(4)
        self.zavreP()
        self.onSvetloCisti()  # zapne čisticí lampu
        time.sleep(4)         # Nastavuje dobu čištění
        self.stop()
        print " Konec Cisteni"
        # vrátí se nahoru
        self.otevreP()
        self.com.write("!0V1000\r !0A100\r !0L"+self.posun+"\r") # +dosavadní tisk a posun    
        self.zavreP()
        time.sleep(4)
        self.posunVanaL()
        
        # sjede dolu a pokračuje v tisku
    def cisteniNavrat(self):
        self.otevreP()
        self.com.write("!0V2000\r !0A100\r !0L-"+self.zdvih+"\r") # posun  dolu o zdvih  
        time.sleep(4)
        self.com.write("!0NX"+self.rxDalsi+"\r") #nastaví čítač pozice na hodnotu před čištěním
        self.zavreP()
        time.sleep(2) 
        self.getPolohaZ()
  #čištění-----------------------------------------------------------------      
      
      # Spínání rele A
    def onClona(self):
        print "Clona otevrena"
        if self.port:
            self.otevreP()
            self.com.write("!0V0,3,0\r  !0L0,90000,0\r")
            self.zavreP()
            #time.sleep(3) 
        else:
            print "Clona"
            
      # Spínání rele B
    def onSvetloCisti(self):
        print "Svetlo (cisteni) zapnuto"
        if self.port:
            self.otevreP()
            self.com.write("!0V0,3,0\r !0L0,-50000,0\r")
            self.zavreP()
        else:
            print "Cistici Svetlo"
        time.sleep(3)    # doba expozice cisteni
        #return
       
       # Spínání rele C
    def onReleC(self):
        if self.port:
            self.otevreP() 
            self.com.write("Rele C")
            self.cti = self.com.readline()
            print self.cti            
            self.com.setDTR(1)
            print "Rele C SEPNUTO"
            time.sleep(10)
            self.com.setDTR(0)
            print "Rele C vypnuto"
            time.sleep(10)
            
            self.zavreP()
            
        else:
            print "Sepne rele C"

    def onSvetlo(self):
        if self.port:
            self.otevreP()
            self.com.write("!0L0,0,1\r")
            self.zavreP()
        else:
            print "Cistici Svetlo"

    def ofSvetlo(self):
        if self.port:
            self.otevreP()
            self.com.write("!0L0,0,-1<CR><LF>\r")
            self.zavreP()
        else:
            print "Cistici Svetlo"     
    
  #---------------------------------------------------------------------------
      
        
    def resetGravos(self):
        self.otevreP()
        self.com.write("!0i1\r")
        rx = self.com.readline() 
        print rx
        if rx =="0,FF\r":
            print "Horní Koncák"
            self.com.write("!0sw0,00\r !0sw2,00\r !0sw4,00\r")
            self.com.write("!0V1000\r !0A10\r !0L-1000\r")
            
        else:
            print "Bez pohybu"
        time.sleep(1) 
        self.com.write("!0sw0,01\r !0sw2,01\r !0sw4,01\r")
        self.zavreP()
        print "RESET"
       
       # Konfigurace ridici desky Gravos
    def onGravos(self):
        if self.port:
            self.otevreP()
            self.com.write("!0sw0,00\r !0sw2,00\r !0sw4,00\r")
            self.rx = self.com.readline()
            print self.rx
            self.zavreP()
        else:
            print "Konfiguruje ridici desku Gravos"
        
    # Sepne rele(1) na desce Gravos (Zapne projektor)         
    def onProjektor(self):
        if self.port:
            self.otevreP()
            self.com.write("!0O0,FB\r")
            time.sleep(1)
            self.com.write("!0O0,FF\r")
            self.zavreP()
        else:
            print "Zapíná projektor"
            
    # Vypne projektor        
    def offProjektor(self):
        self.otevreP()                 
        self.com.write("!0O0,FB\r")           # zapne relé , Tlačítko projektor poprvé
        time.sleep(1)
        self.com.write("!0O0,FF\r")            # vypne  relé
        time.sleep(1)
        self.com.write("!0O0,FB\r")            # zapne relé , Tlačítko projektor podruhé
        time.sleep(1)
        self.com.write("!0O0,FF\r")           # vypne relé            
        self.zavreP()
        print  "Vypíná projektor"            
          
   # Jede nahoru osa Z
    def nahoru(self, pomalu):
        if self.port:
            self.otevreP()
            if pomalu:
                self.com.write(self.nahoruPom)
            else:
                self.com.write(self.nahor)                  
            self.zavreP()

        else:
            print "Jede nahoru pomalu nebo rychle"
         

    def dolu(self, pomalu):
        if self.port:        
            self.otevreP() 
            if pomalu:
                self.com.write(self.doluPom)     
            else:
                self.com.write(self.dol)   
            self.d = self.com.readline()
            self.zavreP()
        else:
            print "Jede dolu pomalu nebo rychle"
            

    def stop(self):
        if self.port:
            self.otevreP()
            self.com.write("!0H\r")         # zastaví
            self.com.write("!0D\r")      # smaže frontu
            #self.s = self.com.readline()
            self.zavreP()
            self.getPolohaZ()
        else:
            print "STOP !"
        
        
    def krok(self, delka):
        if self.port:  
            if delka =="a":
                self.krokD = "!0V7000\r !0A100\r !0L-1885\r" 
            if delka =="b":
                self.krokD = "!0V7000\r !0A100\r !0L-1877\r" 
            if delka =="c":
                self.krokD = "!0V7000\r !0A100\r !0L-1859\r"     
            self.otevreP()
            self.com.write(self.krokN)
            self.kn = self.com.readline()
            time.sleep(0.5)
            self.com.write(self.krokD)
            self.kd = self.com.readline()
            self.zavreP()           
        else:
            print "Jeden krok - nahoru dolu (podle nastavení a, b nebo c)"
        
        
    def krokNah(self, mic, pocet):
        self.mi =mic
        if self.port:
            self.otevreP()
            if self.mi=="a":
                self.poXa = pocet*15
                self.poXa = str(self.poXa)
                self.com.write("!0V3000\r !0A10\r !0L"+self.poXa+"\r")    # X37 mic    
            if self.mi=="b":
                self.poXb = pocet*23
                self.poXb = str(self.poXb)
                self.com.write("!0V3000\r !0A10\r !0L"+self.poXb+"\r")   # X56 mic 
            if self.mi=="c":
                self.poXc = pocet*41
                self.poXc = str(self.poXc)            
                self.com.write("!0V3000\r !0A10\r !0L"+self.poXc+"\r")   # X90 mic
            self.zavreP()
            
        else:
            print " X kroků nahoru"
            
            
    def krokDol(self, mic, pocet):
        self.mi =mic
        if self.port:
            self.otevreP()
            if self.mi=="a":
                self.pXa = pocet*15
                self.pXa = str(self.pXa)            
                self.com.write("!0V3000\r !0A10\r !0L-"+self.pXa+"\r")    # -37X mic        
            if self.mi=="b":
                self.pXb = pocet*23
                self.pXb = str(self.pXb)            
                self.com.write("!0V3000\r !0A10\r !0L-"+self.pXb+"\r")   # -56X mic    
            if self.mi=="c":
                self.pXc = pocet*41
                self.pXc = str(self.pXc)            
                self.com.write("!0V3000\r !0A10\r !0L-"+self.pXc+"\r")   # -90X mic
            self.zavreP()
            
        else:
            print " X kroků dolu"
            
            
    def portNe(self):
        self.port = False

    def otevreP(self):
        if self.port:
            self.com = serial.Serial(0, baudrate=38400, timeout = 1, xonxoff=True)  # inicializace portu COM1
        else:
            print "Otevírá port..Není zařízení"              
        
    def zavreP(self):
        if self.port: 
            self.com.close()             # uzavre port
        else:
            print "Zavírá port..Není zařízení" 
            





